問題解説: 研究の国 第三のトラブル

おはようございます、作問者のやつはしです。

今回は、リソース削減・ネットワーク基盤に依存しないために全て一つのVM上で完結させました。

残念ながら、この問題に辿りついたチームは1つで、解答数は0でした。

日の目を見ることはなかった問題ですが、SDNに関する問題は、今までなかったので参考問題として公開します。

 

問題文

無事に課題が終わったパトリシアは、学校を案内してくれることになった。

パトリシア「課題を手伝ってくれてありがとう♪。じゃあ学校を案内するね」

食堂や教室、体育館などを案内してもらった。

パトリシア「ここが最後よ–ここは私が志望してる研究室で、魔法陣の仮想化を研究しているの」

パトリシア「教授は、OpenFlowを使って特殊なNATを作成しているの……でも、昨日Dockerコンテナに移行してから動いていないそうなの」

エイト「ふむ、ここで教授に恩を売っておきたいところね」

パトリシア「そうなの、でも、私一人じゃできなくて……何度も悪いんだけど、手伝ってくれないかな?」

アクセスできるサーバー

  • サーバ名 : openflow
  • アドレス : openflow.3.mgi
  • ユーザ : admin
  • パスワード : hello_openflow

注意事項

  • VyOS1・VyOS2・VyOS3・VyOS4のIPアドレス・サブネット・VLANに変更を加えてはいけない。(Config自体は変えてもよい)
  • コンテナの停止・再起動は許可する。

達成すべき事項

  • VyOS4で ping 172.16.100.150 を実行し、VyOS3より返答を受け取れる。
  • OpenFlow を使って、 192.168.1.2->172.16.100.150 の SNAT と 172.16.100.150->192.168.1.2 の DNAT を実現する。

その他

OVSがインストールされたUbuntu上に、以下の5つのコンテナが存在する。
– VyOS1(192.168.1.1/24 & 172.16.100.100/24)
– VyOS2(172.16.100.200/24 & 10.30.100.1/24)
– VyOS3(192.168.1.2/24)
– VyOS4(10.30.100.2/24)
– OpenFlowController(Docker Default Network)

以下に簡単なトポロジーを示す。
VyOS3(192.168.1.2)-(192.168.1.1)VyOS(172.16.100.100)-(172.16.100.200)VyOS2(10.30.100.1)-VyOS4(10.30.100.2)

解説

この問題は、OpenvSwitch上でOpenFlowを動かしたもの。

まず、この問題の初期状態は、このようになっている。

OVSの設定を

sudo ovs-vsctl show

で確認すると、VyOS3-VyOS1,VyOS2-VyOS4では、

sudo ovs-vsctl set-fail-mode br0 standalone
sudo ovs-vsctl set-fail-mode br2 standalone

で設定してあり、L2スイッチとして動作している。
次にVyOS1-VyOS2では、

sudo ovs-vsctl set-fail-mode br1 secure

で、OpenFlowのエントリーによって処理されている。
そこで、

sudo ovs-ofctl dump-flows br1 --protocols=OpenFlow13

でエントリーを確認できる。
エントリーでは、図に書いてあるようなIP変換のみ処理されている。
ここでarpによるmacアドレスの解決ができないことに注目する。
なのでVyOS1とVyOS2でお互いにstaticでmacアドレスをお互いに登録する。
しかし、VyOSのconfigにインターフェースの設定を書いた場合、OVSにインターフェースの主導権をとられているため、反映されない。
VyOS1とVyOS2には以下のコマンドでvbashに入る

docker exec -it vyos1 /bin/vbash
docker exec -it vyos2 /bin/vbash

そして、linuxの処理として

arp -s 172.16.100.100 "VyOS2のmacアドレス" dev eth1
arp -s 172.16.100.200 "VyOS1のmacアドレス" dev eth1

staticでmacアドレスと登録する。
これでL2を解決できた。
次に、VyOS3からVyOS4にICMPパケットを飛ばすには、
VyOS1で

docker exec -it vyos1 /bin/vbash
su - vyos
configure
set protocols static route 10.30.100.0/24 next-hop 172.16.100.200
commit
save

のように設定する。
この設定で、ルーティングができるようになったのでICMPパケットが飛ぶ。

これでSDNの一端であるOpenFlowを用いた問題は解決である。
SDNでは、arpやDHCPなどL2の処理をプログラムしなければならない煩わしさがあるが、この問題のようにトポロジーを工夫することで、こういったNATやファイアーウォールなどのフィルターを、簡単に書き導入することが可能である。
ICTSC7では、運営でNAVT(Network Address Vlan Translation[作問者命名])と呼ばれるVLAN+IPaddressを全く別のIPに割り当てることでそれぞれのチームのセグメントIPを同じにし、運営からは、任意のIPアドレスで全チームにアクセスできるようにした。